package com.zxw.java基础.线程.CountDownLatch;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 在上述示例中，我们首先使用Executors.newFixedThreadPool(2)方法创建一个固定大小为2的线程池。然后我们创建一个CountDownLatch对象，并将计数器初始化为2。
 * 接着，我们向线程池中提交两个任务，每个任务模拟耗时操作，并在完成后调用countDownLatch.countDown()方法将计数器减1。
 * 最后，我们调用countDownLatch.await()方法来等待计数器归零，即所有任务都执行完毕后再执行后续的操作，并输出"All tasks finished"。
 * 需要注意的是，如果线程池中的线程数量大于等于计数器的初始值，那么await()方法会立即返回，不会阻塞当前线程。因此，你需要根据实际情况来确定计数器的初始值。
 *
 * @projectName: util-cloud
 * @package: com.zxw.java基础.线程.join
 * @className: ThreadPoolJoinExample
 * @author: zhangxuewei
 * @description: TODO
 * @date: 2023/10/31 13:25
 * @version: 1.0
 */
public class ThreadPoolCountDownLatchExample {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        CountDownLatch countDownLatch = new CountDownLatch(2);

        // 提交任务1到线程池中
        executorService.submit(() -> {
            try {
                Thread.sleep(1000); // 模拟耗时操作
                System.out.println("Task 1 finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown(); // 计数器减1
            }
        });

        // 提交任务2到线程池中
        executorService.submit(() -> {
            try {
                Thread.sleep(2000); // 模拟耗时操作
                System.out.println("Task 2 finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                countDownLatch.countDown(); // 计数器减1
            }
        });

        countDownLatch.await(); // 等待计数器归零

        // 所有任务执行完毕后执行的操作
        System.out.println("All tasks finished");

        executorService.shutdown();
    }
}
